package com.ruoyi.projectAch.service.impl;

import com.ruoyi.projectAch.domain.WebPages;
import com.ruoyi.projectAch.mapper.WebPagesMapper;
import com.ruoyi.projectAch.service.IWebPagesService;
import com.ruoyi.projectAch.utils.URLTitleFetcherUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 附件信息，用于存储网页和相关文件的信息Service业务层处理
 *
 * @author ruoyi
 * @date 2023-11-07
 */
@Service
public class WebPagesServiceImpl implements IWebPagesService {
    @Autowired
    private WebPagesMapper webPagesMapper;

    @Autowired
    URLTitleFetcherUtils urlTitleFetcherUtils;

    //创建一个单线程的ExecutorService，它可以保证任务按提交顺序执行
    private ExecutorService executorService = Executors.newSingleThreadExecutor();

    /**
     * 查询附件信息，用于存储网页和相关文件的信息
     *
     * @param id 附件信息，用于存储网页和相关文件的信息主键
     * @return 附件信息，用于存储网页和相关文件的信息
     */
    @Override
    public WebPages selectWebPagesById(Long id) {
        return webPagesMapper.selectWebPagesById(id);
    }

    /**
     * 查询附件信息，用于存储网页和相关文件的信息列表
     *
     * @param webPages 附件信息，用于存储网页和相关文件的信息
     * @return 附件信息，用于存储网页和相关文件的信息
     */
    @Override
    public List<WebPages> selectWebPagesList(WebPages webPages) {
        return webPagesMapper.selectWebPagesList(webPages);
    }

    public void shutdown() {
        executorService.shutdown();
    }

    /**
     * 新增附件信息，用于存储网页和相关文件的信息
     *
     * @param webPages 附件信息，用于存储网页和相关文件的信息
     * @return 结果
     */
    @Override
    public int insertWebPages(WebPages webPages) {
        // 提交任务到ExecutorService，任务会排队执行
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println(webPages.getUrl() + "开始下载");
                    urlTitleFetcherUtils.clean();
                    urlTitleFetcherUtils.getImage(webPages.getUrl());
                    urlTitleFetcherUtils.copyUrlPage(webPages.getUrl(), webPages);
                    urlTitleFetcherUtils.setTitle(webPages.getUrl(), webPages);
                    urlTitleFetcherUtils.packageFiles(webPages);
                    System.out.println(webPages.getUrl() + "下载结束");
                } catch (Exception e) {
                    // 可以设置错误状态
                    webPages.setStatus("failure");
                    webPages.setTitle("网页克隆失败");
                    webPagesMapper.updateWebPages(webPages);
                    System.out.println(webPages.getUrl() + "下载失败");
                    e.printStackTrace();
                }
            }
        });
        // 提交到数据库的操作可能需要移到线程内部，以确保它在抓取操作后执行
        // 如果确实需要在这里执行，那么可能需要其他的同步机制来保证数据一致性
        return webPagesMapper.insertWebPages(webPages);
    }

    /**
     * 修改附件信息，用于存储网页和相关文件的信息
     *
     * @param webPages 附件信息，用于存储网页和相关文件的信息
     * @return 结果
     */
    @Override
    public int updateWebPages(WebPages webPages) {
        return webPagesMapper.updateWebPages(webPages);
    }

    /**
     * 批量删除附件信息，用于存储网页和相关文件的信息
     *
     * @param ids 需要删除的附件信息，用于存储网页和相关文件的信息主键
     * @return 结果
     */
    @Override
    public int deleteWebPagesByIds(Long[] ids) {
        return webPagesMapper.deleteWebPagesByIds(ids);
    }

    /**
     * 删除附件信息，用于存储网页和相关文件的信息信息
     *
     * @param id 附件信息，用于存储网页和相关文件的信息主键
     * @return 结果
     */
    @Override
    public int deleteWebPagesById(Long id) {
        return webPagesMapper.deleteWebPagesById(id);
    }
}
